home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Texteditors
/
XDME
/
Src
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-26
|
30KB
|
1,371 lines
/******************************************************************************
MODUL
$Id: main.c 1.2 1994/08/09 15:55:50 digulla Exp digulla $
DESCRIPTION
NOTES
BUGS
TODO
EXAMPLES
SEE ALSO
INDEX
HISTORY
28. Nov 1992 ada created
$Log: main.c $
* Revision 1.2 1994/08/09 15:55:50 digulla
* removed debug printf
*
* Revision 1.1 1994/08/09 13:53:34 digulla
* Initial revision
*
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
#include <dos/dostags.h>
#include <clib/layers_protos.h>
#include <pragmas/layers_pragmas.h>
#define MYDEBUG 1
#include "debug.h"
//#define DEBUG
//#define DETACH
/**************************************
Globale Variable
**************************************/
Prototype int main (int, char **);
Prototype void do_tomouse (void);
Prototype void exiterr (char *);
Prototype int breakcheck (void);
Prototype void breakreset (void);
Prototype void ops (char **);
Prototype BOOL loadfile (BPTR, char *);
Prototype struct MsgPort * Sharedport;
Prototype char MShowTitle;
Prototype char noadj;
Prototype struct GfxBase * GfxBase;
Prototype struct __XDMEArgs XDMEArgs;
struct MsgPort * Sharedport; /* Port for all Windows */
char MShowTitle; /* Should DME refresh the title ? */
char noadj; /* for blocking software adj. of prop gad
when intuition (user) already did it */
/* extern struct IntuitionBase * IntuitionBase;
extern struct GfxBase * GfxBase;
extern struct Library * IconBase;
extern struct Library * AslBase; */
extern struct Library * LayersBase;
extern long __stack = 16000;
/**************************************
Typedefs
**************************************/
typedef struct WBStartup WBS;
typedef struct DiskObject DISKOBJ;
/**************************************
Interne Variable
**************************************/
static WORD Mx, My; /* Mouse-Coords */
static WORD oMx, oMy; /* starting coords */
static ULONG newxdme; /* force new xdme */
static const char default_startupfile[] = ".edrc";
static const char default_projectfile[] = "XDME_Project_File";
static const char tmplate[] = "Files/M,"
"Startup=-S/K,"
"New=-N/S,"
"Iconify=-I/S,"
"Autoload=-A/S,"
"PubScreen=-PS/K,"
"ProjectFile=-PF/K";
struct __XDMEArgs XDMEArgs =
{
NULL, /* Files */
NULL, /* Startup-Filename */
FALSE, /* NEW */
FALSE, /* Iconify */
FALSE, /* Autoload */
NULL, /* PublicScreen */
NULL, /* ProjectFile */
/* ... */
};
static const struct Config startup_config =
{
-1, /* wwcol */
0, 0, /* winx, winy */
640, 200, /* winwidth, winheight */
0, 11, /* iwinx, iwiny */
0, 0, /* aslleft/top */
400, 200, /* aslwidth/height */
4, /* tabstop */
75, /* margin */
1, /* fgpen */
0, /* bgpen */
2, /* hgpen */
0, /* tpen */
1, /* bbpen */
1, /* insertmode */
0, /* ignorecase */
0, /* wordwrap */
0, /* autosplit */
1, /* autoindent */
1, /* autounblock */
};
/**************************************
Interne Prototypes
**************************************/
extern void __regargs __chkabort (void);
#ifdef UNUSED
void PrintCWD (void)
{
static char puffer[256];
PROC * proc = (PROC *)FindTask (NULL);
NameFromLock (proc->pr_CurrentDir, puffer, sizeof(puffer));
kprintf ("CWD: `%s'\n", puffer);
}
#endif
int wbmain(WBS * wbs)
{
return (main (0, (char **)wbs));
} /* wbmain */
/* disable ^C checking */
void __regargs __chkabort (void) { /* empty */ }
int main (int mac, char ** mav)
{
ULONG nf; /* # files on command line */
BOOL iawm = 0; /* overide mouse buttons */
BOOL dontwait = 0; /* don't wait for a message */
BOOL LeftArea = 0; /* has mouse after buttonpress moved a certain
distance */
WORD i; /* temp. counter */
WORD Code; /* IDCMP->Code */
ULONG Qualifier; /* IDCMP->Qualifier */
PROC * proc = (PROC *)FindTask(NULL); /* our Task */
BPTR origlock; /* Start-Lock */
ULONG wait_ret; /* HD Result of Wait */
ULONG Mask = 0; /* Mask for Wait() */
BOOL gad_active = 0; /* Is any gadget active ? */
UWORD gad_id; /* Which one ? */
WORD mqual; /* Qualifiers for mmove */
BOOL mmove = 0; /* Mousemove */
int show_cursor; /* shall I redraw the cursor ? */
/*#if MYDEBUG
D(bug("------------- Hallo, hier ist XDME ----------------\n"));
#endif // */
#ifdef DETACH
/* Detach from CLI */
fclose (stdin);
fclose (stdout); /* debugging output needs kprintf ! */
fclose (stderr); /* close stderr & console ref. */
#endif
/* cd to dir of shell */
origlock = CurrentDir (DupLock (proc->pr_CurrentDir));
/* Init lists */
NewList ((LIST *)&DBase);
NewList ((LIST *)&PBase);
init_macros ();
init_variables ();
path_init ();
init_kb ();
/* IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library", 37L);
GfxBase = (struct GfxBase *)OpenLibrary ("graphics.library", 37L);
if (!IntuitionBase || !GfxBase)
exiterr ("cannot open intuition or graphics library");
AslBase = OpenLibrary ("asl.library", 37L); */
ReqToolsBase = (struct ReqToolsBase *)OpenLibrary ("reqtools.library", 37);
PageJump = 80; /* 80% of page for Propgad & pageup/down */
String = NULL; /* initialize scanf variable */
ActualBlock.ep = NULL; /* No block */
/* making a default-ed-config */
movmem (&startup_config, &default_config, CONFIG_SIZE);
/* setting default flags */
globalflags.Wdisable = 1;
globalflags.ActivateToFront = 1;
globalflags.Windowcycling = 1;
globalflags.Showtitle = 1;
if (mac == 0)
{ /* WORKBENCH STARTUP */
globalflags.Wdisable = 0; /* allow icon save */
Wbs = (WBS *)mav;
/* if (!(IconBase = OpenLibrary ("icon.library", 0)) )
exiterr ("unable to open icon library"); */
}
/* Init AREXX */
mountrequest (0);
openrexx (); /* do this after the last possible call to exiterr() */
mountrequest (1);
/* Init Keyboard */
init_structures (); /* PATCH_NULL [28 Jan 1993] : added */
// resethash (currenthash()); /* PATCH_NULL [25 Jan 1993] : added currenthash() */
{
struct MsgPort * mp;
Forbid ();
mp = FindPort ("XDME.1");
Permit ();
newxdme = (!strcmp (RexxPortName, "XDME.1") || !mp);
}
nf = 0;
/* Here we have to set the names BEFORE the parsing since none of the
Arg-Parsers does set them (we make copies later) */
XDMEArgs.projectfilename = default_projectfile; /* no strdup() here ! */
XDMEArgs.startupfile = default_startupfile; /* no strdup() here ! */
/* WB-Startup or CLI ? */
if (Wbs)
{
/* Work on TOOLTypes */
if (Wbs->sm_ArgList[0].wa_Lock)
{
DISKOBJ * dobj; /* For WB-Startup */
struct WBArg * wbarg;
BPTR current;
for (i=0; i<Wbs->sm_NumArgs; i++)
{
wbarg = &Wbs->sm_ArgList[i];
UnLock (CurrentDir (current = DupLock (wbarg->wa_Lock)));
if (dobj = GetDiskObject (wbarg->wa_Name))
{
/* Only process names for ToolTypes, not for the the
program itself ! */
ops (dobj->do_ToolTypes);
if (i)
{
if (loadfile (wbarg->wa_Lock, wbarg->wa_Name))
nf ++;
else
{
FreeDiskObject (dobj);
break;
}
}
FreeDiskObject (dobj);
}
}
/* CD to new base-dir */
UnLock (CurrentDir (DupLock (Wbs->sm_ArgList[0].wa_Lock)));
}
} else
{
XDMEArgs.newxdme = newxdme;
/* Parse CLI-args */
if ((XDMEArgs.ra = ReadArgs (tmplate, (LONG *)&XDMEArgs, NULL))
&& XDMEArgs.files)
{
#ifdef DEBUG
UWORD count = 0;
#endif
char ** nameptr;
for (nameptr=XDMEArgs.files; *nameptr; nameptr ++)
{
#ifdef DEBUG
D(bug("Loading %ld %s ...\n", count ++, *nameptr));
#endif
if (loadfile (origlock, *nameptr))
nf ++;
else
break;
}
}
}
#ifdef DEBUG
D(bug("Parsed ARGS\n"));
#endif
if (XDMEArgs.startupfile)
XDMEArgs.startupfile = strdup (XDMEArgs.startupfile);
else
{
#ifdef DEBUG
D(bug("ERROR: XDMEArgs.startupfile == NULL <<<------------\n"));
#endif
XDMEArgs.startupfile = strdup (default_startupfile);
}
#ifdef DEBUG
D(bug("Startup-file : \"%s\"\n", XDMEArgs.startupfile));
#endif
if (XDMEArgs.projectfilename)
XDMEArgs.projectfilename = strdup (XDMEArgs.projectfilename);
else
{
#ifdef DEBUG
D(bug("ERROR: XDMEArgs.projectfilename == NULL <<<------------\n"));
#endif
XDMEArgs.projectfilename = strdup (default_projectfile);
}
#ifdef DEBUG
D(bug("Projectfile : \"%s\"\n", XDMEArgs.projectfilename));
#endif
if (XDMEArgs.publicscreenname)
XDMEArgs.publicscreenname = strdup (XDMEArgs.publicscreenname);
#ifdef DEBUG
D(bug("Screen : \"%s\"\n", XDMEArgs.publicscreenname ?
XDMEArgs.publicscreenname : "WBench"));
#endif
/* Free args */
if (XDMEArgs.ra)
FreeArgs (XDMEArgs.ra);
if (!nf)
{ /* no files to edit: Open simple empty window */
if (XDMEArgs.newxdme || newxdme)
{
do_newwindow ();
if (!Ep)
goto quit_dme;
if (XDMEArgs.iconify)
do_iconify ();
} else
{
if (XDMEArgs.iconify)
{
do_rexx ("XDME.1", "newwindow iconify");
} else
{
do_rexx ("XDME.1", "newwindow");
}
}
} /* No files */
if (!XDMEArgs.newxdme) /* All done, quit */
goto quit_dme;
/* Read main .edrc file */
mountrequest (0);
av[0] = "source";
av[1] = (UBYTE *)"s:.edrc";
do_source (TRUE); /* Display error */
/* Read other file (if possible) */
if (NameFromLock (origlock, tmp_buffer, sizeof(tmp_buffer)))
{
AddPart (tmp_buffer, XDMEArgs.startupfile, sizeof(tmp_buffer));
av[1] = tmp_buffer;
do_source (FALSE); /* Not */
}
mountrequest (1);
/* Initialize certain fields in structure */
{
ED * ep;
ED * eb = GetHead ((LIST *)&DBase);
UWORD ix, iy;
for (ep = eb; ep = GetSucc(&ep->node); )
{
ix = ep->beginconfig.iwinx;
iy = ep->beginconfig.iwiny;
movmem (&eb->beginconfig, &ep->beginconfig, CONFIG_SIZE);
ep->beginconfig.iwinx = ix;
ep->beginconfig.iwiny = iy;
if (eb->font)
{
ep->font = eb->font;
eb->font->tf_Accessors ++;
} /* if font */
} /* for ed */
}
/* Get Wait()-Mask */
Mask |= 1 << Sharedport->mp_SigBit;
wait_ret = 0;
loop:
if (!Ep->iconmode) /* Display cursor ? */
text_cursor (1);
for ( ; !globalflags.Quitflag; )
{
if (!Ep->iconmode)
window_title ();
if (dontwait)
{
dontwait --;
} else
{
/* Wait for Window, AREXX or ^C */
wait_ret = Wait (Mask | RexxMask | SIGBREAKF_CTRL_C);
}
show_cursor = 0; /* don't update cursor */
/*
* NOTE: due to operation of breakcheck(), the userport signal
* may not be set even if there are messages pending.
*/
if (wait_ret & RexxMask) /* HD RexxMessage */
{
text_cursor (0);
extern_rexx_command (); /* process HD rexxcommand */
show_cursor ++;
}
else if (wait_ret & SIGBREAKF_CTRL_C)
{
globalflags.QuitAll = 1;
globalflags.Quitflag = 1;
goto boom;
}
else if (wait_ret & Mask) /* HD IntuiMessage */
{
IMESS * im;
while (im = (IMESS *)GetMsg(Ep->win->UserPort))
{
globalflags.Abortcommand = 0;
globalflags.Msgchk = 1;
Code = im->Code;
Qualifier = im->Qualifier;
clearbreaks ();
if (im->IDCMPWindow != Ep->win)
{
globalflags.Overide = 0;
if (globalflags.Comlinemode)
escapecomlinemode ();
text_sync ();
MShowTitle = 0;
if (!Ep->iconmode)
window_title ();
if (text_switch (im->IDCMPWindow) == 0)
{
ReplyMsg ((MSG *)im);
continue;
}
}
Mx = im->MouseX;
My = im->MouseY;
switch(im->Class)
{
case IDCMP_NEWSIZE: {
struct Window * win = Ep->win;
WORD wid;
WORD hei;
/* Only works if uniconified */
if (!Ep->iconmode)
{
/* clear damage list */
BeginRefresh (Ep->win);
EndRefresh (Ep->win, TRUE);
/* Leave Comlinemode if neccessary */
if (globalflags.Comlinemode)
escapecomlinemode ();
/* Set new window-parameters */
set_window_params ();
/* Erase if neccessary */
wid = win->Width - win->BorderRight - 1;
hei = win->Height - win->BorderBottom - 1;
SetAPen (win->RPort, TEXT_BPEN);
SetWrMsk (win->RPort, BLOCK_MASK);
if (wid > Xpixs)
{
RectFill (win->RPort, Xpixs+1, Ybase,
wid, hei);
}
if (hei > Ypixs)
{
RectFill (win->RPort, Xbase, Ypixs+1,
Xpixs, hei);
}
/* Update Text */
text_adjust (TRUE);
show_cursor ++;
}
break; } /* NEWSIZE */
case IDCMP_REFRESHWINDOW:
if (!Ep->iconmode)
OptimizedRefresh (Ep);
break; /* REFRESHWINDOW */
case IDCMP_MOUSEBUTTONS: {
static WORD lastCode = 0;
static ULONG lastSeconds;
static ULONG lastMicros;
ULONG Seconds;
ULONG Micros;
/* get time of message */
Seconds = im->Seconds;
Micros = im->Micros;
/* Avoid Crashing if Window is closed during keyctl() */
ReplyMsg ((struct Message *)im);
im = NULL;
switch(Code)
{
case MENUDOWN:
if (Ep->iconmode)
break;
case MIDDLEDOWN:
case SELECTDOWN:
/* if we only activated the window with a
buttonpress, ignore it */
if (iawm)
break;
/* if there was no click yet or
the button changed or this is no
double-click anymore, then clear
the number of clicks and use the new code */
if (!NumClicks ||
lastCode != Code ||
!DoubleClick (lastSeconds, lastMicros,
Seconds, Micros))
{
lastCode = Code; /* new code */
NumClicks = 0; /* button changed */
}
/* remember the time of this click */
lastSeconds = Seconds;
lastMicros = Micros;
/* increase the number of clicks */
NumClicks ++;
ReportMouse (TRUE, Ep->win);
ModifyIDCMP (Ep->win, Ep->win->IDCMPFlags |
IDCMP_INTUITICKS);
oMx = Mx;
oMy = My;
LeftArea = FALSE;
break;
case SELECTUP:
case MENUUP:
case MIDDLEUP:
ReportMouse (FALSE, Ep->win);
ModifyIDCMP (Ep->win, Ep->win->IDCMPFlags &
~IDCMP_INTUITICKS);
break;
}
if (Code == MENUDOWN && Ep->iconmode)
{
uniconify ();
show_cursor ++;
} else if (!iawm)
{
#ifdef NOT_DEF /* PATCH_NULL [15 Feb 1993] : added */
if (MacroRecord)
{
sprintf (tmp_buffer, "setptr %d %d", Mx, My);
add_record (tmp_buffer);
} /* if */
#endif
text_cursor (0);
show_cursor ++;
#if 1 /* PATCH_NULL 03-07-94 */
/* /* WARNING - THESE VALUES MIGHT INTERFERE WITH OTHER KEYS */
/* COMMENT: */
/* Wir sollten noch eine Ueberpruefung der Mausposition einbauen und */
/* (unter Beruecksichtigung eines Schwellwertes) bei Mausbewegungen */
/* NumClicks auf 0 resetten, das sollte jedoch jemand machen, der */
/* sich in main auskennt, nicht ich ;-) */
/* dasselbe ist zu den Qualifiern zu sagen, wenn die sich aendern, */
/* waere es vielleicht geschickter, NumClicks wieder auf 0 zurueck- */
/* zusetzten */
/* noch besser ware es natuerlich, dieses Verhalten ueber FLAGS zu */
/* regeln, damit alle Seiten zufrieden sind 8-) */
/* oder soll diese Funktionalitaet nach keyctl verlagert werden? ;-) */
/* (just my $0.02) */
if ((NumClicks > 1) && (NumClicks < 5))
{
switch (Code)
{
case SELECTDOWN: Code = (2 - NumClicks) + 0x67; break;
case MIDDLEDOWN: Code = (2 - NumClicks) + 0x64; break;
case MENUDOWN: Code = (2 - NumClicks) + 0x61; break;
/* /* WARNING - THESE VALUES MIGHT INTERFERE WITH OTHER KEYS */
default: ;
} /* switch */
}
else if ((NumClicks > 1) && !(Code & 0x80))
NumClicks = 0;
#endif /* PATCH_NULL 03-07-94 */
keyctl (NULL, Code, Qualifier);
} else
iawm = FALSE;
break; } /* IDCMP_MOUSEBUTTONS */
case IDCMP_RAWKEY: {
IMESS copy;
ULONG prevkeys; /* PATCH_NULL 27-06-94 */
/* Prevent crashing in do_iconify()->
closesharedwindow */
copy = *im;
prevkeys = *(ULONG*)im->IAddress; /* PATCH_NULL 27-06-94 */
copy.IAddress = &prevkeys; /* PATCH_NULL 27-06-94 */
ReplyMsg ((struct Message *)im);
im = NULL;
text_cursor (0);
show_cursor ++;
keyctl (©, Code, Qualifier);
break; } /* IDCMP_RAWKEY */
case IDCMP_MENUPICK: {
/* PATCH_NULL [02 Apr 1993] : menucontrol like keycontrol >>> */
IMESS copy;
/* Prevent crashing in do_iconify()-> closesharedwindow */
copy = *im;
ReplyMsg ((struct Message *)im);
im = NULL;
text_cursor (0);
show_cursor ++;
menu_cmd (©);
/* PATCH_NULL [02 Apr 1993] : menucontrol like keycontrol <<< */
break; } /* IDCMP_MENUPICK */
case IDCMP_CLOSEWINDOW:
if (globalflags.Comlinemode)
escapecomlinemode ();
text_sync ();
globalflags.Quitflag = TRUE;
show_cursor = 0;
break; /* IDCMP_CLOSEWINDOW */
case IDCMP_ACTIVEWINDOW:
if (!Ep->iconmode)
iawm = TRUE;
break; /* IDCMP_ACTIVEWINDOW */
case IDCMP_MOUSEMOVE:
if (gad_active)
{
int newtop = new_top ();
if (newtop != Ep->topline)
{
noadj = 1; /* don't touch the damn prop-gadget ! */
text_sync ();
newtop -= Ep->topline;
text_cursor (0); /* Cursor off */
show_cursor ++;
Ep->line += newtop;
Ep->topline += newtop;
text_load ();
scroll_display (0, newtop, 0, Ep->topline,
MAXLINELEN, Ep->topline + Lines);
}
}
else
{
/* Lost ButtonUP ? */
if (!(Qualifier & ( IEQUALIFIER_MIDBUTTON |
IEQUALIFIER_RBUTTON |
IEQUALIFIER_LEFTBUTTON )) )
{
ReportMouse (FALSE, Ep->win);
ModifyIDCMP (Ep->win, Ep->win->IDCMPFlags &
~IDCMP_INTUITICKS);
break;
}
/* Process these after all messages have been
processed */
if (!LeftArea)
{
if (((Mx > oMx) ? Mx-oMx>4 : oMx-Mx>4) ||
((My > oMy) ? My-oMy>4 : oMy-My>4) )
LeftArea = TRUE;
}
if (LeftArea)
{
mmove = 1;
mqual = Qualifier;
}
}
break; /* IDCMP_MOUSEMOVE */
case IDCMP_GADGETDOWN:
if (globalflags.Comlinemode)
escapecomlinemode ();
gad_id = ((struct Gadget *)im->IAddress)->GadgetID;
if (!gad_id)
{
noadj = 1; /* block software prop refresh */
} else
{
text_cursor (0);
show_cursor ++;
if (gad_id == 1)
do_scrollup ();
else
do_scrolldown ();
}
/* up&down */
if (gad_id == 1 || gad_id == 2)
ModifyIDCMP (Ep->win, Ep->win->IDCMPFlags |
IDCMP_INTUITICKS);
else if (gad_id == 0) /* scroller */
text_adjust (FALSE);
gad_active = TRUE;
break;
case IDCMP_GADGETUP: {
gad_id = ((struct Gadget *)im->IAddress)->GadgetID;
switch (gad_id)
{
case 0: { /* scroller */
int newtop = new_top ();
if (newtop != Ep->topline)
{ /* Make sure we don't miss a jump */
noadj = 1; /* don't touch the damn prop-gadget ! */
text_sync ();
newtop -= Ep->topline;
text_cursor (0); /* Cursor off */
show_cursor ++;
Ep->line += newtop;
Ep->topline += newtop;
text_load ();
scroll_display (0, newtop, 0, Ep->topline,
MAXLINELEN, Ep->topline + Lines);
}
break; }
case 4: /* zoom */
if (!Ep->iconmode)
{
/* IMESS copy; dead assign */
/* Prevent crashing in do_iconify()-> closesharedwindow */
/* copy = *im; dead assign */
ReplyMsg ((struct Message *)im);
im = NULL;
iconify ();
}
break;
default:
ModifyIDCMP (Ep->win, Ep->win->IDCMPFlags &
~IDCMP_INTUITICKS);
}
gad_active = FALSE;
noadj = 0; /* reallow software prop refresh */
break; }
case IDCMP_INTUITICKS:
if (gad_active && gad_id)
{
text_cursor (0);
show_cursor ++;
if (gad_id == 1)
do_scrollup ();
else
do_scrolldown ();
} else if (LeftArea)
{
mmove = 1;
mqual = Qualifier;
}
break; /* IDCMP_INTUITICKS */
} /* switch (class) */
if (im)
ReplyMsg ((MSG *)im);
if (globalflags.Quitflag)
{
dontwait = 2;
goto boom;
} /* if (Quitflag) */
} /* While IntuiMessage */
} /* if (Wait & Mask) */
/* no more iawm */
iawm = FALSE;
if (mmove && !Ep->iconmode)
{
mmove = 0;
#ifdef NOT_DEF /* PATCH_NULL [15 Feb 1993] : added */
if (MacroRecord) {
sprintf (tmp_buffer, "setptr %d %d", Mx, My);
add_record (tmp_buffer);
} /* if */
#endif
text_cursor (0);
show_cursor ++;
keyctl (NULL, QMOVE, mqual);
} /* if (mmove) */
if (show_cursor && !Ep->iconmode)
text_cursor (1);
} /* for ( ; !Quitflag; ) */
boom:
text_sync ();
/* Close window(s) */
{
WIN * win;
struct Gadget * gadget;
int result;
do
{
if (Ep->modified)
{
uniconify ();
text_cursor (1);
result = getyn ("XDME Warning",
"The file `%s' has been modified.\n"
"Do you want to quit anyway (and loose all\n"
"your work) ?",
"Quit|Save & Quit|Cancel", Ep->name);
switch (result)
{
case 0:
globalflags.Quitflag = 0;
goto loop;
break;
case 2:
if (!do_save ())
{
globalflags.Quitflag = 0;
goto loop;
}
break;
}
}
win = Ep->win;
gadget = Ep->propgad;
rem_prop (Ep);
text_uninit ();
closesharedwindow (win);
if (gadget)
free_prop ((struct PropGadget *)gadget);
} while (globalflags.QuitAll && Ep);
}
/* If we have another window left */
if (Ep)
{
globalflags.Quitflag = 0;
if (!Ep->iconmode)
set_window_params ();
text_load ();
MShowTitle = 0;
goto loop;
}
quit_dme:
/* Close AREXX */
closerexx ();
/* Close Port after ARexx */
if (Sharedport)
{
DeletePort (Sharedport);
Sharedport = NULL;
}
/* Free Lock */
UnLock (CurrentDir (origlock));
/* Free memory */
// dealloc_hash (currenthash()); /* PATCH_NULL [25 Jan 1993] : added currenthash */
check_stack (NULL);
if (XDMEArgs.startupfile)
free (XDMEArgs.startupfile);
if (XDMEArgs.projectfilename)
free (XDMEArgs.projectfilename);
if (XDMEArgs.publicscreenname)
free (XDMEArgs.publicscreenname);
#ifdef DEBUG_MEM_H
_debug_FreeAllMem ();
#endif /* DEBUG_MEM_H */
clear_record ();
exit_menustrips ();
exit_keytables ();
/* All OK. */
exiterr (NULL);
} /* main */
Prototype void OptimizedRefresh (ED *);
void OptimizedRefresh (ED * ep)
{
BOOL old;
noadj = 1; /* don't touch the damn prop-gadget ! */
BeginRefresh (ep->win);
LockLayer (NULL, ep->win->WLayer);
/* text_redisplay (); Must not be used because it calls RefreshGList() */
/* leave Comlinemode */
if (old = globalflags.Comlinemode)
escapecomlinemode ();
/* clear background */
SetAPen (ep->win->RPort, 0);
RectFill (ep->win->RPort, Xbase,Ybase, Xpixs, Ypixs);
redraw_block (TRUE, ep->topline, ep->topcolumn,
ep->topline + Lines - 1, ep->topcolumn + Columns - 1);
if (old)
do_recall ();
text_cursor (1);
UnlockLayer (ep->win->WLayer);
EndRefresh (ep->win, TRUE);
noadj = 0;
} /* OptimizedRefresh */
void do_tomouse (void)
{
WORD cx, cy;
WORD minx, miny, maxx, maxy;
if (Columns < 2 || Lines < 2)
return;
cx = (Mx-Xbase);
if (cx >= 0)
{
if (cx < Xpixs)
cx /= Xsize;
else
cx = Lines;
} else
cx = -1;
cy = (My-Ybase);
if (cy >= 0)
{
if (cy < Ypixs)
cy /= Ysize;
else
cy = Columns;
} else
cy = -1;
minx = 0; /* Scroll when MOUSE left window */
miny = 0;
maxx = Columns;
maxy = Lines;
if (cx < minx)
{ /* to the left */
do_scroll (SCROLL_LEFT);
if (cy < miny)
{ /* Also up */
do_scrollup ();
} else if (cy >= maxy)
{ /* also down */
do_scrolldown ();
}
} else if (cx >= maxx)
{ /* dito to the right */
do_scroll (SCROLL_RIGHT);
if (cy < miny)
{
do_scrollup ();
} else if (cy >= maxy)
{
do_scrolldown ();
}
} else
{ /* x is ok, check y */
if (cy < miny)
{ /* up */
do_scrollup ();
} else if (cy >= maxy)
{ /* down */
do_scrolldown ();
} else
text_position (cx, cy); /* Just reposition cursor */
}
} /* do_tomouse */
void exiterr (char * str)
{
if (str)
{
if (Output ())
{
Write (Output (), str, strlen (str));
Write (Output (), "\n", 1);
} else
{
if (IntuitionBase)
error (str);
}
}
/* if (IconBase)
{
CloseLibrary (IconBase);
IconBase = NULL;
} */
if (ReqToolsBase)
{
if (RFReq)
{
rtFreeRequest (RFReq);
RFReq = NULL;
}
CloseLibrary ((struct Library *)ReqToolsBase);
ReqToolsBase = NULL;
}
if (AslBase)
{
if (FReq)
{
FreeAslRequest (FReq);
FReq = NULL;
}
/* CloseLibrary (AslBase);
AslBase = NULL; */
}
/* if (GfxBase)
{
CloseLibrary ((struct Library *)GfxBase);
GfxBase = NULL;
}
if (IntuitionBase)
{
CloseLibrary ((struct Library *)IntuitionBase);
IntuitionBase = NULL;
} */
if (str)
exit (1);
exit (0);
} /* exiterr */
/*
* Check break by scanning pending messages in the Inputstream for a ^C.
* Msgchk forces a check, else the check is only made if the signal is
* set in the Inputstream (the signal is reset).
*/
int breakcheck (void)
{
IMESS * im;
WIN * win = Ep->win;
struct List * list = &win->UserPort->mp_MsgList;
ULONG sigs = SetSignal(0,SIGBREAKF_CTRL_C); /* PATCH_NULL [14 Feb 1993] : that mode slows looping not markably down ; PATCH_NULL 20-07-94 clearing ctl-c */
if ((sigs & SIGBREAKF_CTRL_C) != 0) { /* PATCH_NULL [14 Feb 1993] : These lines are */
globalflags.Abortcommand = 1; /* PATCH_NULL 20-07-94 added */
return(1); /* PATCH_NULL [14 Feb 1993] : intended to allow */
}
else if (globalflags.Msgchk || (sigs & (1<<win->UserPort->mp_SigBit))) /* PATCH_NULL [14 Feb 1993] : external breaking */
{
globalflags.Msgchk = 0;
SetSignal (0,1<<win->UserPort->mp_SigBit);
im = (IMESS *)list->lh_Head;
Forbid();
for ( ; im != (IMESS *)&list->lh_Tail;
im = (IMESS *)im->ExecMessage.mn_Node.ln_Succ)
{
if (im->Class == RAWKEY && (im->Qualifier & 0xFB) == 0x08 &&
im->Code == CtlC)
{
Permit ();
// SetSignal (SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); /* PATCH_NULL 20-07-94 commented out */
globalflags.Abortcommand = 1; /* PATCH_NULL 20-07-94 added */
return (1);
}
} /* for IMESS */
Permit ();
}
return (0);
} /* breakcheck */
void breakreset (void)
{
SetSignal(0, SIGBREAKF_CTRL_C);
}
/* Parse WB-ToolTypes */
void ops (char ** toolarray)
{
char * tooltype;
if (tooltype = FindToolType (toolarray, "ICONIFY"))
XDMEArgs.iconify = MatchToolValue (tooltype, "YES");
else
XDMEArgs.iconify = FALSE;
if (tooltype = FindToolType (toolarray, "NEW"))
XDMEArgs.newxdme = MatchToolValue (tooltype, "YES") | newxdme;
else
XDMEArgs.newxdme = newxdme;
if (tooltype = FindToolType (toolarray, "AUTOLOAD"))
XDMEArgs.autoload = MatchToolValue (tooltype, "YES");
else
XDMEArgs.autoload = FALSE;
if (tooltype = FindToolType (toolarray, "PUBSCREEN"))
XDMEArgs.publicscreenname = tooltype; /* no strdup() here ! */
if (tooltype = FindToolType (toolarray, "PROJECTFILE"))
XDMEArgs.projectfilename = tooltype; /* no strdup() here ! */
if (tooltype = FindToolType (toolarray, "STARTUP"))
XDMEArgs.startupfile = tooltype; /* no strdup() here ! */
#ifdef DEBUG
D(bug("sfile: %s\nnew %ld\niconify %ld\nauto %ld\n"
"PSName: `%s'\npf: `%s'\n", XDMEArgs.startupfile,
XDMEArgs.newxdme, XDMEArgs.iconify, XDMEArgs.autoload,
XDMEArgs.publicscreenname ? XDMEArgs.publicscreenname : "(nul)",
XDMEArgs.projectfilename ? XDMEArgs.projectfilename : "(nul)"));
#endif
} /* ops */
BOOL loadfile (BPTR lock, char * name)
{
char buf[512];
/* Load project ? */
if (!stricmp (name, XDMEArgs.projectfilename))
{
if (XDMEArgs.newxdme)
{
return ((BOOL) load_project ());
} else
{
strcpy (buf, "cd `");
if (NameFromLock (lock, buf + 4, sizeof (buf) - 4))
{
strcat (buf, "' projectload");
do_rexx ("XDME.1", buf);
}
}
} else
{
if (XDMEArgs.newxdme)
{
/* Normal file. Open new window */
do_newwindow ();
if (!Ep)
return (FALSE);
/* Load file for editing */
av[0] = (UBYTE *)"newfile";
av[1] = (UBYTE *)name;
UnLock (Ep->dirlock);
Ep->dirlock = DupLock (lock);
do_edit ();
/* Show title */
globalflags.MForceTitle = 1;
window_title ();
if (XDMEArgs.iconify)
do_iconify ();
} else
{ /* Use AREXX */
strcpy (buf, "newwindow cd `");
if (NameFromLock (lock, buf + 14, sizeof (buf) - 14))
{
sprintf (buf + strlen (buf), "' newfile `%s'%s",
name, (XDMEArgs.iconify ? " iconify" : ""));
do_rexx ("XDME.1", buf);
}
}
} /* No PROJECTFILE */
return (TRUE);
} /* loadfile */
/******************************************************************************
***** ENDE main.c
******************************************************************************/